home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG: World of Games / PC-SIG World of Games (CDRM1080710) (1993).iso / SWMAG / DISK1533.ZIP / RM.C < prev    next >
C/C++ Source or Header  |  1989-05-09  |  3KB  |  105 lines

  1. #include <stdio.h>
  2. #include <sys\types.h>
  3. #include <sys\stat.h>
  4. #include <errno.h>
  5. #include <io.h>
  6.  
  7. /*
  8.  * rm.c - unix remove utility - expands wildcards during deletes, and
  9.  * allows multiple datasets on the command line
  10.  */
  11.  
  12. static    char *Program [] ={ "rm - remove files v1.r1.s0 - va/psj@" };
  13. static    char *Usage = "usage: rm [-cfnt?] file [file...]\n";
  14.  
  15. #define FALSE    0
  16. #define TRUE    1
  17.  
  18. int chmod(char *, int);
  19. int unlink(const char *);
  20.  
  21. int errno;
  22.  
  23. int main(int argc, char * argv[])
  24. {
  25.     short unsigned int siOption;
  26.     unsigned register int riFiles = 0;
  27.     unsigned register int riTries = 0;
  28.  
  29.     short int    siType    = FALSE;    /* type names */
  30.     short int    siCount = FALSE;    /* count files */
  31.     short int    siForce = FALSE;    /* force indicator */
  32.     short int    siNACK    = FALSE;    /* no action flag */
  33.  
  34.     if (argc < 2)
  35.     _exit(fprintf(stderr, "%s", Usage) + 0x10);
  36.  
  37.     while(--argc > 0) {
  38.     ++argv;     /* find first argument */
  39.     if((siOption = **argv) == '-' || siOption == '/')
  40.         while(siOption = *(++(*argv))) {    /* process flag */
  41.         switch(toupper(siOption)) {
  42.             case 'C':
  43.             siCount = TRUE;
  44.             break;
  45.             case 'F':
  46.             siForce = TRUE;
  47.             break;
  48.             case 'T':
  49.             siType = TRUE;
  50.             break;
  51.             case 'N':
  52.             siNACK = siType = TRUE;
  53.             break;
  54.             case '?':
  55.             printf("rm: options summary\n\n\t"
  56.                 "-c count files and show total when done\n\t"
  57.                 "-f force R/O files to R/W before delete\n\t"
  58.                 "-n show files - deletion not performed\n\t"
  59.                 "-t type file names after deletion\n\n");
  60.             _exit(0x00);
  61.  
  62.             default:
  63.             fprintf(stderr, "rm: illegal option %c\n", siOption);
  64.         }   /* switch closed */
  65.         }    /* while closed */
  66.     else {    /* now past flags - process file */
  67.         if(siForce && chmod(*argv, S_IREAD|S_IWRITE)) {
  68.         fprintf(stderr, "rm: can't force %s - not removed\n", *argv);
  69.         continue;
  70.         }
  71.         ++riTries;
  72.         siForce = FALSE;
  73.         if(!siNACK && unlink(*argv))
  74.         switch(errno) {
  75.             case EACCES:
  76.             fprintf(stderr, "rm: %s  directory or read-only\n",
  77.                     *argv);
  78.             break;
  79.             case ENOENT:
  80.             fprintf(stderr, "rm: %s  no such file\n", *argv);
  81.             break;
  82.             default:
  83.             fprintf(stderr, "rm: %s  unknown failure\n", *argv);
  84.         }
  85.         else {
  86.         ++riFiles;
  87.         if(siType)
  88.             printf("%s ", *argv);
  89.         if(!siNACK)
  90.             printf("removed");
  91.         putchar('\n');
  92.         }    /* file deleted without a problem */
  93.     }   /* else past flags */
  94.     }    /* while not more flags ... */
  95.  
  96.     if (siCount)
  97.     if(riTries)
  98.         if(riFiles)
  99.         printf("\n\t%u file(s) removed\n", riFiles);
  100.         else
  101.         printf("\n\tremoved none of %u file(s)\n", riTries);
  102.     else
  103.         printf("rm: none matched\n");
  104. }
  105.